package com.aust.reflect;

/**
 * 类的字节码文件：每个 .class 文件中存储着这个类的完整结构信息（如属性、方法、继承结构等），在程序运行时，这些信息会被加载进内存，由 JVM 解析。
 * Class 对象：一旦某个类被 JVM 加载，JVM 就会为它创建一个唯一的 java.lang.Class 类型的对象。这个对象就是程序操作这个类的“入口”。
 * 反射 API 所做的事情就是：基于这个 Class 对象，动态获取和操作类的信息，例如：
 * 获取字段（Field）
 * 获取方法（Method）
 * 获取构造器（Constructor）
 * 调用方法（invoke）
 * 修改字段值（set）
 * 创建实例（newInstance）
 */

/**
 * 概念	            说明
 * .class 字节码文件	是编译后的物理文件，存储了类的结构
 * Class 对象	    是 JVM 把字节码加载后，在内存中生成的类的运行时表示，是反射的入口
 * 反射的本质	        就是利用这个 Class 对象，在运行时动态操作类的成员
 */
public class Reflect1 {
    public static void main(String[] args) throws ClassNotFoundException {
        /**
         * 获取 Student 类的 Class 对象（即字节码在内存中的表示）
         */
        // 方式一
        Class<Student> studentClass1 = Student.class;

        // 方式二
        Student student = new Student();
        Class<? extends Student> studentClass2 = student.getClass();

        // 方式三
        Class<?> studentClass3 = Class.forName("com.aust.reflect.Student");

        System.out.println(studentClass1.equals(studentClass2));
        System.out.println(studentClass2.equals(studentClass3));
        System.out.println(studentClass3.equals(studentClass1));

        /**
         * 类加载器（ClassLoader） 的核心作用是：
         * 将 .class 字节码文件加载到 JVM 内存中，并把它们转换成 Java 中的 Class 对象，供程序使用。
         */
        System.out.println(studentClass1);
        System.out.println(studentClass1.getClass());
        System.out.println(studentClass1.getClassLoader());
        System.out.println(studentClass1.getName());
        System.out.println(studentClass1.getSimpleName());
    }
}
